\section{Chromium体系结构}
Chromium体系结构中有两个模块：渲染引擎和浏览器内核。从较高层面来看，渲染引擎负责将HTTP响应和用户输入事件转化为位图，而浏览器内核负责同操作系统进行交互。浏览器内核暴露API供渲染引擎使用，例如访问网络，访问持久化存储，显示位图到用户屏幕。浏览器内核可以被信任充当浏览器用户；而渲染引擎仅被信任充当网络站点。
\begin{table}[]
    \vspace{10pt}
    \centering
    \begin{tabular}{c|c}
        渲染引擎 & 浏览器内核\\
        \hline
        HTML parsing        &  Cookie database\\
        CSS parsing         &  History database\\
        Image decoding      &  Password database\\
        JavaScript interpreter &  Window management\\
        Regular expressions    &  Location bar\\
        Layout                 &  Safe Browsing blacklist\\
        Document Object Model  &  Network stack\\
        Rendering   &  SSL/TLS\\
        SVG         &  Disk cache\\
        XML parsing &  Download manager\\
        XSLT        & Clipboard\\
        \multicolumn{2}{c}{共同} \\
        \hline
        \multicolumn{2}{c}{URL parsing}    \\
        \multicolumn{2}{c}{Unicode parsing}
    \end{tabular}
    %\label{bs2}
    \caption{渲染引擎与浏览器内核的任务分配}
\end{table}

\begin{itemize}
\item \textbf{渲染引擎.}  渲染引擎通过提供的默认行为（例如绘制\textbf{input}元素）和调用DOM API来解释并执行网页内容。渲染网页内容需要经历若干阶段，首先是解析（parsing），然后经历建立DOM在内存中的表示，图形化文档，根据脚本执行操作文档等步骤。渲染引擎也负责执行同源策略，防止恶意网站破坏用户与真实网站的会话。渲染引擎具有一定的复杂性，并且直接同不能完全信任的网页内容进行交互。例如大部分的解析发生在渲染引擎中，包括HTML解析，图像解码和JS解析等。这些复杂的组件往往有一些关于安全的历史遗留漏洞（见第6节）。为了同用户、同本地机器以及网络进行交互，渲染引擎使用浏览器内核提供的API。渲染引擎运行在受限的沙箱中。
\item \textbf{浏览器内核.}  浏览器内核负责管理渲染引擎的多个实例并且实现浏览器内核的API（见第5节）。举例来说，浏览器内核实现了一个基于标签页的窗口系统，包括显示当前浏览网页URL的地址栏和与之关联的安全标记。浏览器内核管理持久的状态，像用户的书签，cookies以及保存密码。它也负责访问网络并且作为中间层联系渲染引擎和操作系统原生的窗口管理器。为了实现其API，浏览器内核会维护有关已授予每个渲染引擎的权限的状态信息，例如允许每个渲染引擎上传哪些文件的列表。浏览器内核使用此状态来实施安全策略，该策略约束渲染引擎能够与操作系统进行何种交互。
\end{itemize}

浏览器的组件功能分配到浏览器内核还是渲染引擎考虑了多方面的因素，例如安全，兼容性和性能等，但是有些组件功能分配则考虑了其历史因素。例如浏览器内核负责展示JavaScript中的\textbf{<alert>}弹窗，而渲染引擎处理\textbf{<select>}下拉框。有一些特性，例如cookie数据库，由浏览器内核实现的直接原因是浏览器内核能够直接访问文件系统。其他有些特性，例如正则表达式，由渲染引擎实现主要因为他们与性能有关而且通常是安全漏洞发生的原因。

如表1所示，渲染引擎负责大部分的解析和解码工作，因为历史原因，这些任务是众多浏览器漏洞的重要来源。举例来说，展示网站的缩略图到浏览器标签中，浏览器内核从网络接收图片数据但是并不会直接尝试将图片解码，而是将图片传递给渲染引擎去执行解码操作，渲染引擎返回一张未经压缩的位图，然后浏览器内核复制位图显示到屏幕上。这一系列看起来很复杂的步骤有助于防止知道图像解码器中未修补漏洞的攻击者控制浏览器内核。

这个模式的一个例外是网络堆栈。HTTP堆栈负责解析HTTP响应头，根据\textbf{Content-Encodings}调用相应的\textbf{gzip}或者\textbf{bzip2}解码器去解压缩HTPP响应内容。这个任务可以放到渲染引擎中去做，不过会带来网络堆栈的复杂或以及性能降低等问题。另一个例子是浏览器内核和渲染引擎都在解析URL，因为URL处理无处不在。

\noindent \textbf{处理粒度.}  粗略来说，Chromium中每一个标签都使用了一个独立的渲染引擎去显示来自网络的内容，这样便对渲染引擎的崩溃具有了一定的容错性。Chromium页使用渲染引擎去展示受信任的内容，例如插页式的HTTPS证书错误或者钓鱼网站等。然而，这些渲染任务运行在单独的渲染引擎实例中并不会直接处理从网络获得的内容。这个模式的一个例外是Web Inspector，它显示受信任的内容并由包含Web内容的渲染引擎进行渲染。使用此种设计的原因是Web Inspector 与他所检查的页面需要进行非常频繁的交互。

\noindent \textbf{插件.}  在Chromium的体系结构中，每个插件运行在一个独立于浏览器内核和渲染引擎之外的单独的客户端进程中。为了保持对现存网站的兼容性，浏览器插件不能在渲染引擎中执行因为插件供应商希望对于整个浏览器只有至多有一个插件实例。如果插件运行于浏览器内核，插件崩溃将带来整个浏览器的崩溃。

默认情况下，每一个插件在沙箱之外执行并且拥有用户的所有权限。这种设置维持了对现有插件以及网站的兼容性，因为插件可以具有任意行为。举例来说，Flash Player插件能够访问用户的麦克风以及摄像头，当然也能够写入到文件系统（更新自己以及存储Flash Cookies）。此设置的缺点在于，攻击者可以利用插件中未修补的漏洞在用户的计算机上安装恶意软件。

供应商可以编写可在Chromium沙箱中运行的插件将来版本，以提供更强大的防御插件漏洞的能力。 Chromium还包含一个选项，可以在沙箱中运行现有的插件。 为此，请使用\textbf{--safe-plugins}命令行选项运行浏览器。 此设置是实验性的，可能会导致不稳定或意外行为。例如，沙盒插件可能无法将自己更新为较新版本。